package com.mentalhealth.diary.controller;

import com.mentalhealth.diary.common.R;
import com.mentalhealth.diary.entity.User;
import com.mentalhealth.diary.mapper.UserMapper;
import com.mentalhealth.diary.utils.JwtUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.HashMap;
import java.util.Map;
import java.util.UUID;

/**
 * 认证控制器
 * 处理用户登录、注册等认证相关功能
 */
@RestController
@RequestMapping("/api/auth")
public class AuthController {

    @Autowired
    private UserMapper userMapper;
    
    @Autowired
    private JwtUtils jwtUtils;
    
    /**
     * 用户登录
     * @param loginData 登录数据，包含phone和password
     * @return 登录结果，包含token和用户信息
     */
    @PostMapping("/login")
    public R<Map<String, Object>> login(@RequestBody Map<String, String> loginData) {
        String phone = loginData.get("phone");
        String password = loginData.get("password");
        
        // 验证参数
        if (phone == null || password == null || phone.isEmpty() || password.isEmpty()) {
            return R.error("手机号和密码不能为空");
        }
        
        // 根据手机号查询用户
        User user = userMapper.selectOne("phone", phone);
        
        if (user == null) {
            return R.error("用户不存在");
        }
        
        // 验证密码（实际应该使用密码加密比较）
        if (!password.equals(user.getPassword())) {
            return R.error("密码错误");
        }
        
        // 生成JWT令牌
        String token = jwtUtils.generateToken(user.getId(), user.getPhone());
        
        // 构建返回数据
        Map<String, Object> result = new HashMap<>();
        result.put("token", token);
        result.put("user", user);
        
        return R.success(result);
    }
    
    /**
     * 用户注册
     * @param registerData 注册数据
     * @return 注册结果
     */
    @PostMapping("/register")
    public R<String> register(@RequestBody Map<String, String> registerData) {
        String phone = registerData.get("phone");
        String password = registerData.get("password");
        String code = registerData.get("code");
        
        // 验证参数
        if (phone == null || password == null || phone.isEmpty() || password.isEmpty()) {
            return R.error("手机号和密码不能为空");
        }
        
        // 检查用户是否已存在
        User existingUser = userMapper.selectOne("phone", phone);
        if (existingUser != null) {
            return R.error("该手机号已被注册");
        }
        
        // 创建新用户
        User newUser = new User();
        newUser.setPhone(phone);
        newUser.setPassword(password); // 实际应该加密存储
        newUser.setNickname("用户" + phone.substring(7));
        newUser.setAvatar("https://via.placeholder.com/100");
        newUser.setGender(0);
        newUser.setStatus(1);
        
        // 保存用户
        int result = userMapper.insert(newUser);
        if (result > 0) {
            return R.success("注册成功");
        } else {
            return R.error("注册失败，请稍后重试");
        }
    }
    
    /**
     * 发送短信验证码
     * @param phone 手机号
     * @return 发送结果
     */
    @PostMapping("/send-code")
    public R<String> sendCode(@RequestBody Map<String, String> requestData) {
        String phone = requestData.get("phone");
        
        // 验证手机号格式
        if (phone == null || !phone.matches("^1[3-9]\\d{9}$")) {
            return R.error("请输入正确的手机号");
        }
        
        // 生成验证码（实际应该调用短信服务API）
        String verificationCode = String.format("%06d", (int) (Math.random() * 1000000));
        
        // TODO: 集成短信服务发送验证码
        System.out.println("向手机号 " + phone + " 发送验证码：" + verificationCode);
        
        return R.success("验证码发送成功");
    }
    
    /**
     * 获取当前登录用户信息
     * @param request HTTP请求对象
     * @return 用户信息
     */
    @GetMapping("/info")
    public R<User> getInfo(@RequestAttribute("userId") Long userId) {
        User user = userMapper.selectById(userId);
        if (user != null) {
            user.setPassword(null); // 不返回密码
            return R.success(user);
        }
        return R.error("用户不存在");
    }
    
    /**
     * 用户退出登录
     * @return 退出结果
     */
    @PostMapping("/logout")
    public R<String> logout() {
        // 在分布式系统中，可能需要将token加入黑名单
        // 这里简单返回成功
        return R.success("退出成功");
    }
}